﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using extremeEvents.Data;
using System.IO;

namespace extremeEvents.Eventos
{
    public partial class EditarEvento : UserControl
    {
        //utilizado para perceber qual a data a ser editar
        int data = 0;
        //o id do evento que está a ser editar no momento
        private int id;

        public EditarEvento()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Faz o load do formulario
        /// </summary>
        /// <param name="id">O ID do evento</param>
        public void carregar(int id)
        {

            //guardar referencia do evento que está a ser editado
            this.id = id;

            try{

                List<listarCategorias_Result> lCat = DLGenerica.Instance.getCategorias();

                for (int i = 0; i <= lCat.Count - 1; i++)
                {
                    this.cbCategoria.Items.Insert(i, lCat.ElementAt(i).descricao);
                }

                //procurar utilizador seleccionado
                var rst = (procurarEventoSemFlyer_porID_Result)DLGenerica.Instance.getEventoSemFlyerById(id);

                cbCategoria.SelectedIndex = cbCategoria.Items.IndexOf(rst.Categoria);
                txPreco.Text = ((float)rst.Preco).ToString("#.##");
                txTitulo.Text = rst.Titulo;
                txDescricao.Text = rst.Descricao;
                txMorada.Text = rst.Morada;
                txUrl.Text = rst.URL;
                txContacto.Text = rst.Contacto;
                txEmail.Text = rst.Email;
                txDe.Text = rst.Data_Inicio.ToString("yyyy-MM-dd");
                txAte.Text = rst.Data_Fim.ToString("yyyy-MM-dd");
                txLatitude.Text = rst.Latitude;
                txLongitude.Text = rst.Longitude;
                txCodigo_Postal.Text = rst.Codigo_Postal;

                monthCalendar1.SelectionRange.Start = rst.Data_Inicio;
                monthCalendar1.SelectionRange.End = rst.Data_Fim;

            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

        }

        /// <summary>
        /// Faz o submit do formulario e retorna ao menu anterior
        /// </summary>
        private void submit()
        {

            DateTime de = new DateTime();
            DateTime ate = new DateTime();
            Decimal preco = new decimal();

            //tentar fazer o parsing das datas e do preço
            DateTime.TryParse(txDe.Text, out de);
            DateTime.TryParse(txAte.Text, out ate);
            Decimal.TryParse(txPreco.Text.Replace(".",","), out preco);

            var error_msg = ""; //utilizada para guardar o erro encontrado

            //verificar dados obrigatorios
            if (de.CompareTo(ate) > 0)
                error_msg = "Error 27: A data de inicio não pode ser posterior à final";
            else if (txTitulo.Text.Length == 0)
                error_msg = "Error 28: O titulo inserido é invalido. Por favor corrija-o e tente novamente";
            else if (txDescricao.Text.Length == 0)
                error_msg = "Error 29: A Desrição inserida é invalida. Por favor corrija-a e tente novamente";

            //verifica se foi encontrado algum erro
            if (error_msg.Length > 0)
            {
                MessageBox.Show(error_msg, "Erro ao guardar as alterações");
                return;
            }

            //editar evento
            bool rst = DLGenerica.Instance.editarEvento(
                Navegador.Instance.id_evento, 
                cbCategoria.SelectedIndex + 1, 
                de, 
                ate,
                txTitulo.Text, 
                txDescricao.Text, 
                preco, 
                txMorada.Text, 
                txCodigo_Postal.Text,
                txUrl.Text, 
                txContacto.Text, 
                txEmail.Text, 
                txLatitude.Text, 
                txLongitude.Text
            );

            if (!rst) {
                MessageBox.Show("Erro 30: Occoreu um erro ao editar o evento!");
                return;
            }

            //informa utilizador que foi editado com sucesso
            MessageBox.Show("Evento editado com sucesso!");
            //retornar à lista de eventos
            Navegador.Instance.irPara("eventosPage");
        }

        /// <summary>
        /// Utilizado para definir as datas de inicio e fim
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e)
        {
            if (monthCalendar1.SelectionRange.Start == monthCalendar1.SelectionRange.End)
            {
                if (data == 0)
                {
                    txDe.Text = monthCalendar1.SelectionRange.Start.ToString("yyyy-MM-dd");
                }
                else
                {
                    txAte.Text = monthCalendar1.SelectionRange.End.ToString("yyyy-MM-dd");
                }
            }
            else
            {
                txDe.Text = monthCalendar1.SelectionRange.Start.ToShortDateString();
                txAte.Text = monthCalendar1.SelectionRange.End.ToShortDateString();

            }

            //esconder calendario
            monthCalendar1.Visible = false;
        }

        /// <summary>
        /// Mostar calendario ao clicar na data
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txDe_Click(object sender, EventArgs e)
        {
            data = 0;
            monthCalendar1.Visible = true;
        }
        /// <summary>
        /// Mostar calendario ao clicar na data
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void txAte_Click(object sender, EventArgs e)
        {
            data = 1;
            monthCalendar1.Visible = true;
        }

        /// <summary>
        /// Ir para o lista eventos ao clicar em cancelar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btCancelar_Click(object sender, EventArgs e)
        {
            Navegador.Instance.irPara("eventosPage");
        }

        /// <summary>
        /// Submeter formulário ao clicar em guardar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btGuardar_Click(object sender, EventArgs e)
        {
            //submeter formulario
            this.submit();
        }

        private void EditarEvento_Paint(object sender, PaintEventArgs e)
        {
            Navegador.Instance.editarEvtForm = this;
        }

        private void EditarEventoForm_VisibleChanged(object sender, EventArgs e)
        {

            //carregar apenas se estiver visivel
            if (!this.Visible)
                return;

            //carregar dados
            this.carregar(Navegador.Instance.id_evento);

        }
        
    }
}
